package com.yzk.aigy.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yzk.aigy.exception.MyCustomerException;
import com.yzk.aigy.mapper.SysRoleMenuMapper;
import com.yzk.aigy.model.system.SysMenu;
import com.yzk.aigy.model.system.SysRoleMenu;
import com.yzk.aigy.model.system.SysUserRole;
import com.yzk.aigy.model.vo.AssginMenuVo;
import com.yzk.aigy.model.vo.RouterVo;
import com.yzk.aigy.service.SysMenuService;
import com.yzk.aigy.mapper.SysMenuMapper;
import com.yzk.aigy.utils.MenuHelper;
import com.yzk.aigy.utils.RouterHelper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
* @description 针对表【sys_menu(菜单表)】的数据库操作Service实现
*/
@Service
@Transactional
@RequiredArgsConstructor
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu>
    implements SysMenuService{

    private final SysRoleMenuMapper sysRoleMenuMapper;

    @Override
    public List<SysMenu> findNodes() {
        //1.获取所有的菜单
        List<SysMenu> menuList = baseMapper.selectList(null);
        //2.所有菜单数据转换要求数据格式
        return MenuHelper.buildTree(menuList);
    }

    @Override
    public void removeMenuById(Long id) {
        //查询当前删除菜单下面是否子菜单 根据id = parent_id
        int count = baseMapper.selectCount(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getParentId, id));
        if(count > 0) throw new MyCustomerException(201, "请先删除子菜单"); //有子菜单
        baseMapper.deleteById(id); //调用删除
    }

    @Override
    public List<SysMenu> findSysMenuByRoleId(Long roleId) {
        // 获取所有 status 为 1 的权限列表
        List<SysMenu> menuList = baseMapper.selectList(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getStatus, 1));

        //根据角色id获取角色权限
        List<SysRoleMenu> roleMenus = sysRoleMenuMapper.selectList(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId, roleId));

        //获取该角色已分配的所有权限id
        List<Long> roleMenuIds = new ArrayList<>();
        for (SysRoleMenu roleMenu : roleMenus) {
            roleMenuIds.add(roleMenu.getMenuId());
        }
        //遍历所有权限列表
        for (SysMenu sysMenu : menuList) {
            sysMenu.setSelect(roleMenuIds.contains(sysMenu.getId()));
        }
        //将权限列表转换为权限树
        return MenuHelper.buildTree(menuList);
    }

    @Override
    public void doAssign(AssginMenuVo assginMenuVo) {
        //删除已分配的权限
        sysRoleMenuMapper.delete(Wrappers.<SysRoleMenu>lambdaUpdate().eq(SysRoleMenu::getRoleId, assginMenuVo.getRoleId()));
        //遍历所有已选择的权限id
        for (Long menuId : assginMenuVo.getMenuIdList()) {
            if(menuId != null){
                //创建SysRoleMenu对象
                SysRoleMenu sysRoleMenu = new SysRoleMenu();
                sysRoleMenu.setMenuId(menuId);
                sysRoleMenu.setRoleId(assginMenuVo.getRoleId());
                //添加新权限
                sysRoleMenuMapper.insert(sysRoleMenu);
            }
        }
    }

    @Override
    public List<RouterVo> findUserMenuList(Long id) {

        List<SysMenu> sysMenuList = getMenuListById(id);

        //构建树形数据
        List<SysMenu> sysMenuTreeList = MenuHelper.buildTree(sysMenuList);

        // MenuHelper返回的数据属性和 前端路由的属性不一致，所以要处理
        //构建路由
        List<RouterVo> routerVoList = RouterHelper.buildRouters(sysMenuTreeList);

        return routerVoList;
    }

    @Override
    public List<String> findUserPermsList(Long id) {
        List<SysMenu> sysMenuList = getMenuListById(id);
        //创建返回的集合
        List<String> permissionList = new ArrayList<>();
        for (SysMenu sysMenu : sysMenuList) {
            if(sysMenu.getType() == 2){
                permissionList.add(sysMenu.getPerms());
            }
        }
        return permissionList;
    }

    private List<SysMenu> getMenuListById(Long id) {
        //超级管理员admin账号id为：1
        //我们约定 admin 是 超级管理员拥有所有的权限
        List<SysMenu> sysMenuList;
        if (id == 1) {
            //a.  表示是超级管理员
            Wrapper<SysMenu> wrapper = Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getStatus, 1).orderByAsc(SysMenu::getSortValue);
            sysMenuList = baseMapper.selectList(wrapper);
        } else {
            // b. 其他非超级管理员的 用户
            sysMenuList = baseMapper.findListByUserId(id);
        }
        return sysMenuList;
    }

}




